﻿using System;
// 默认情况下，接口成员的实现是隐式定义为sealed。为了能重载，必须在基类中标识为virtual或者abstract。
namespace _052_虚方法实现接口成员
{
    public interface IUndoable { void Undo(); }
    public class TextBox:IUndoable
    {
        public virtual void Undo()
        {
            Console.WriteLine("TextBox.Undo");
        }
    }
    public class RichTextBox:TextBox
    {
        public override void Undo()
        {
            Console.WriteLine("RichTextBox.Undo");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // 不管从基类还是接口中调用给接口成员，调用都是子类的实现：
            RichTextBox r = new RichTextBox();
            r.Undo(); // RichTextBox.Undo
            ((IUndoable)r).Undo(); // RichTextBox.Undo
            ((TextBox)r).Undo(); // RichTextBox.Undo

            /* 显式实现的接口成员不能被标记为virtual的，也不能实现通常意义的重载。但是它可以被重新实现。 */
            Console.ReadKey();
        }
    }
}
